/**
 * 「类型 + 方括号」表示法
**/
let fibonacci:number[] = [1,1,2,3,5];

//数组的项中不允许出现其他的类型
let fibonacci: number[] = [1, '1', 2, 3, 5];
/* 出错 index.ts(1,5): error TS2322: Type '(number | string)[]' is not assignable to type 'number[]'.
   Type 'number | string' is not assignable to type 'number'.
   Type 'string' is not assignable to type 'number'.
*/
// 数组的一些方法的参数也会根据数组在定义时约定的类型进行限制：
let fibonacci: number[] = [1, 1, 2, 3, 5];
fibonacci.push('8');
// 出错 index.ts(2,16): error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'.


/**
 * 数组泛型
**/
let fibonacci: Array<number> = [1, 1, 2, 3, 5];


/**
 * 用接口表示数组
**/
interface NumberArray{
	[index: number]:number;
}
let fibonacci: NumberArray = [1,1,2,3,5];
//NumberArray 表示：只要 index 的类型是 number，那么值的类型必须是 number。


/**
 * any 在数组中的应用
 * 
 * 一个比较常见的做法是，用 any 表示数组中允许出现任意类型：
**/
let list: any[] = ['Xcat Liu', 25, { website: 'http://xcatliu.com' }];



/**
 * 类数组
 * 
 * 类数组（Array-like Object）不是数组类型，比如 arguments：
**/
function sum() {
	let args: number[] = arguments;
}
// index.ts(2,7): error TS2322: Type 'IArguments' is not assignable to type 'number[]'.
// Property 'push' is missing in type 'IArguments'.

/*
* 事实上常见的类数组都有自己的接口定义，如 IArguments, NodeList, HTMLCollection 等：
*/
function sum() {
	let args: IArguments = arguments;
}













